{
  "openapi": "3.1.0",
  "info": {
    "title": "Open API",
    "description": "Gestiona de forma remota los perfiles de navegador y los runtimes de navegador en la nube de MoreLogin a través de la MoreLogin Open API.\n\n**URL base**: `https://api.morelogin.com`\n\nLa Open API gestiona los mismos perfiles de navegador que la Local API, pero no requiere el\ncliente de escritorio de MoreLogin. Como no interviene ningún cliente local, la Open API no puede lanzar un navegador\nen tu propia máquina. En su lugar, puede iniciar el perfil como un **runtime en la nube** que se ejecuta en\nla infraestructura de MoreLogin y se controla mediante el Chrome DevTools Protocol (CDP).\n\n| Capacidad | Local API | Open API |\n| --- | --- | --- |\n| Gestionar perfiles, proxies, grupos y etiquetas | Sí | Sí |\n| Lanzar el navegador en tu propia máquina | Sí | No |\n| Lanzar el navegador en la nube de MoreLogin | Sí | Sí |\n\n**Codificación de los ID**: los ID de MoreLogin son enteros de 64 bits en el servidor, pero se serializan en JSON como\ncadenas decimales para evitar la pérdida de precisión en JavaScript. Envíalos como cadenas y léelos como cadenas.\n\nLa autenticación usa un token Bearer de OAuth2. Consulta\n[Autenticación](../Getting%20Started/authentication.md) para más detalles.\n",
    "version": "2026-09-05"
  },
  "servers": [
    {
      "url": "https://api.morelogin.com",
      "description": "Endpoint de la MoreLogin Open API"
    }
  ],
  "security": [
    {
      "OpenApiBearer": []
    }
  ],
  "tags": [
    {
      "name": "Profiles",
      "description": "Crea, actualiza, consulta y elimina configuraciones de perfiles de navegador."
    },
    {
      "name": "Cloud Runtime",
      "description": "Inicia, detiene, consulta y conecta perfiles de navegador que se ejecutan en la nube de MoreLogin."
    },
    {
      "name": "Fingerprint & Device Config",
      "description": "Versiones de kernel del navegador, user agents, resoluciones, idiomas, zonas horarias y modelos de dispositivo."
    },
    {
      "name": "Cache",
      "description": "Borra la caché del perfil del lado de la nube."
    }
  ],
  "paths": {
    "/env/create/quick": {
      "post": {
        "summary": "Creación rápida de perfil de navegador",
        "description": "Crea de 1 a 200 perfiles de navegador que comparten una misma configuración.\n- **Requisitos previos**: el plan del equipo debe tener suficientes perfiles restantes y la cuota diaria de creación no puede estar agotada. `isEncrypt=1` requiere que el equipo tenga configurada una clave de cifrado. Firefox solo está disponible en Windows y macOS. Un `groupId` ya debe existir, pero si pasas `groupName` en su lugar el grupo se crea automáticamente.\n- **Efecto**: inserta los perfiles, consume capacidad del plan e incrementa el contador diario de creación. Pasar datos de conexión de proxy también puede crear un registro de proxy.\n- **Finalización**: sincrónica. `data` contiene los ID de los perfiles nuevos en orden de creación.\n- **Reintentos**: no es idempotente y no hay clave de idempotencia. Confírmalo con `/env/page` en lugar de reintentar.\n- **Open API**: no se lee ninguna información del cliente, así que puedes fijar las características de la máquina con `systemBitType` y `architecture`. Los kernels provienen únicamente del conjunto publicado. **Las llamadas simultáneas no se serializan**, por lo que dos peticiones en paralelo pueden superar ambas la comprobación de cuota.\n\nErrores de negocio documentados: `19002`, `19063`, `19064`, `19104`, `19106`, `19107`, `19108`, `19111`, `19112`, `14023`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "quickCreateBrowserProfileOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuickCreateRequest"
              },
              "example": {
                "quantity": 1,
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "groupName": "Marketing",
                "isEncrypt": 0,
                "browserCore": 0,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "description": "IDs de los perfiles creados, en orden de creación.",
                          "items": {
                            "$ref": "#/components/schemas/EnvironmentId"
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    "1800000000000001"
                  ],
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            }
          }
        }
      }
    },
    "/env/create/advanced": {
      "post": {
        "summary": "Creación avanzada de perfil de navegador",
        "description": "Crea un perfil de navegador con una configuración de huella completa.\n- **Requisitos previos**: las mismas comprobaciones de plan y cuota diaria que en la creación rápida. El nombre del perfil debe ser único dentro del equipo, las coordenadas deben quedar fuera de China continental, y `advancedSetting.ua` debe concordar con `uaVersion`. Si indicas un `proxyId`, ya debe existir en el equipo.\n- **Efecto**: inserta el perfil, sus credenciales de cuenta (cifradas en reposo) y la configuración posterior al arranque; consume capacidad del plan y el contador diario de creación. Una URL de plataforma personalizada también crea un registro de sitio.\n- **Finalización**: sincrónica. `data` contiene el ID del perfil nuevo.\n- **Reintentos**: no es idempotente. Una segunda llamada con el mismo `envName` explícito falla en la comprobación de unicidad; sin nombre, crea un duplicado. No hay clave de idempotencia. No reintentes a ciegas tras un timeout: consulta primero el estado.\n- **Open API**: no se lee ningún sistema operativo ni versión de cliente; los kernels provienen únicamente del conjunto publicado. **Las llamadas simultáneas no se serializan.**\n\nErrores de negocio documentados: `19001`, `19002`, `19004`, `19005`, `19063`, `19064`, `19100`, `19101`, `19102`, `19103`, `19104`, `19105`, `19106`, `19107`, `19108`, `19109`, `19110`, `19111`, `19112`, `19141`, `19175`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "advancedCreateBrowserProfileOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdvancedCreateRequest"
              },
              "example": {
                "envName": "marketing-01",
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "groupName": "Marketing",
                "isEncrypt": 0,
                "envRemark": "Created through the Open API",
                "uaVersion": 124,
                "browserCore": 124,
                "systemBitType": 1,
                "architecture": 0,
                "afterStartupConfig": {
                  "afterStartup": 2,
                  "autoOpenUrls": [
                    "https://example.com"
                  ],
                  "stayOnCheckIPPage": false
                },
                "startupParams": [
                  "--disable-notifications"
                ],
                "disableAudio": 0,
                "disableVideo": 0,
                "disableImg": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/EnvironmentId"
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": "1800000000000001",
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            }
          }
        }
      }
    },
    "/env/update": {
      "post": {
        "summary": "Modificar perfil de navegador",
        "description": "Actualiza un perfil de navegador existente. Solo se cambian los campos presentes en la petición.\n- **Requisitos previos**: el perfil debe existir en el equipo. Los perfiles con cifrado de extremo a extremo no se pueden actualizar. El sistema operativo y el tipo de navegador no se pueden cambiar. Un perfil en ejecución sí se puede actualizar.\n- **Efecto**: escribe el registro del perfil, sus ajustes ampliados y las cookies, y combina los ajustes avanzados de huella (los valores existentes se conservan salvo que se sobrescriban).\n- **Finalización**: sincrónica.\n- **Reintentos**: es seguro repetir con el mismo cuerpo. Ten en cuenta que no hay bloqueo optimista: las actualizaciones simultáneas de un mismo perfil se resuelven con la última escritura, y la combinación de la huella lee antes de escribir, así que dos llamadas simultáneas pueden perder cambios.\n- **Open API**: cuando hay que volver a emparejar el kernel, se usa el sistema operativo que ya está guardado en el perfil. No se lee ningún sistema operativo ni versión de cliente.\n\nErrores de negocio documentados: `19001`, `19039`, `19104`, `19105`, `19106`, `19107`, `19108`, `19142`, `19159`, `19160`, `19175`, `19193`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "updateBrowserProfileOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRequest"
              },
              "example": {
                "envId": "1800000000000001",
                "envName": "marketing-01-updated",
                "envRemark": "Updated through the Open API",
                "uaVersion": 124,
                "browserCore": 124,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/env/page": {
      "post": {
        "summary": "Obtener una lista de perfiles de navegador",
        "description": "Lista los perfiles de navegador visibles para el miembro autenticado, página a página.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Filtrado**: `keyword` coincide con el nombre del perfil, el comentario, el nombre de etiqueta y el nombre de grupo. Un `groupId` de `0` significa sin grupo.\n- **Nota**: las contraseñas de proxy se omiten para los miembros ordinarios y para los proxies de plataforma o dinámicos.\n- **Paginación**: empieza en 1. `dataList` es un array vacío cuando no hay resultados.",
        "operationId": "listBrowserProfilesOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvPageRequest"
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "keyword": "marketing"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/EnvPageData"
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "total": "1",
                    "current": "1",
                    "pages": "1",
                    "dataList": [
                      {
                        "id": "1800000000000001",
                        "envName": "marketing-01",
                        "groupId": "0",
                        "groupName": "Marketing",
                        "tagInfos": [
                          {
                            "id": "1800000000000301",
                            "tagName": "important"
                          }
                        ],
                        "envRemark": "Created through the Open API",
                        "proxyId": "1800000000000101",
                        "proxy": {
                          "id": "1800000000000101",
                          "proxyName": "proxy-a",
                          "proxyType": 2,
                          "proxyProvider": 0,
                          "proxyCategoryType": 2,
                          "proxyCheckStatus": 1,
                          "proxyStatus": 0,
                          "state": "California",
                          "city": "Los Angeles",
                          "proxyPort": 1080,
                          "proxyIp": "127.0.0.1",
                          "exportIp": "203.0.113.10",
                          "countryCode": "US",
                          "expiryTime": "1786320000000",
                          "username": "user",
                          "password": "pass",
                          "refreshUrl": "https://example.com/refresh"
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/detail": {
      "post": {
        "summary": "Obtener los detalles de un perfil de navegador",
        "description": "Devuelve la configuración completa de un único perfil de navegador, incluidos los ajustes avanzados de huella y las cookies.\n- **Requisitos previos**: el perfil debe existir en el equipo y quien llama debe estar autorizado para él.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Nota**: las contraseñas de cuenta y los secretos 2FA solo se devuelven al propietario del equipo, o cuando el perfil no está configurado para ocultarlos.",
        "operationId": "getBrowserProfileDetailOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvIdRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/EnvDetail"
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "id": "1800000000000001",
                    "envName": "marketing-01",
                    "browserTypeId": 1,
                    "operatorSystemId": 1,
                    "groupId": "0",
                    "groupName": "Marketing",
                    "tagIds": [
                      "1800000000000301"
                    ],
                    "tagInfos": [
                      {
                        "id": "1800000000000301",
                        "tagName": "important"
                      }
                    ],
                    "proxyId": "1800000000000101",
                    "isEncrypt": 0,
                    "envRemark": "Created through the Open API",
                    "uaVersion": 124,
                    "browserCore": 124,
                    "accountInfo": {
                      "username": "account@example.com",
                      "password": "secret",
                      "siteId": "1800000000000201",
                      "platformId": "9999",
                      "customerUrl": "https://example.com",
                      "otpSecret": "BASE32SECRET"
                    },
                    "isShowAccount": 0,
                    "afterStartupConfig": {
                      "afterStartup": 2,
                      "autoOpenUrls": [
                        "https://example.com"
                      ],
                      "platformUrl": "https://platform.example.com"
                    },
                    "startupParams": [
                      "--disable-notifications"
                    ],
                    "cookies": "[{\"name\":\"sid\",\"value\":\"abc\"}]",
                    "advancedSetting": {
                      "language": "en-US",
                      "timezone": "America/Los_Angeles"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/removeToRecycleBin/batch": {
      "post": {
        "summary": "Eliminar perfiles de navegador",
        "description": "Mueve uno o varios perfiles de navegador a la papelera de reciclaje.\n- **Requisitos previos**: el perfil no puede estar ya en la papelera, no puede estar en ejecución y no puede estar en proceso de transferencia. Cierra antes el navegador.\n- **Efecto**: es un borrado lógico. Se conservan el registro, la huella y la caché en la nube, y el perfil se marca como reciclado con una marca de tiempo. La capacidad del plan se libera de inmediato, pero el contador diario de creación no se reembolsa.\n- **Finalización**: sincrónica.\n- **Recuperación**: la restauración desde la papelera no está expuesta en la superficie de la API: usa el cliente de MoreLogin o la consola web.\n- **Reintentos**: repetir la llamada informa de que el perfil ya está eliminado; no puede borrarlo dos veces.",
        "operationId": "batchRemoveBrowserProfilesOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envIds": {
                    "type": "array",
                    "description": "IDs de los perfiles que se mueven a la papelera. No puede estar vacío.",
                    "minItems": 1,
                    "items": {
                      "$ref": "#/components/schemas/EnvironmentId"
                    }
                  }
                },
                "required": [
                  "envIds"
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001",
                  "1800000000000002"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/env/lock/query": {
      "post": {
        "summary": "Obtener el estado de bloqueo de un perfil de navegador",
        "description": "Informa de si un perfil de navegador está retenido en este momento por otro miembro del equipo.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Semántica**: para que sea `true` hacen falta todas estas condiciones: el equipo tiene activada la función de bloqueo de seguridad, existe un bloqueo, y quien lo retiene es alguien distinto de quien llama. El bloqueo se retiene por miembro y con caducidad, así que puede expirar por sí solo.",
        "operationId": "queryBrowserProfileLockOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvIdRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "envId": {
                              "$ref": "#/components/schemas/EnvironmentId"
                            },
                            "locked": {
                              "type": "boolean",
                              "description": "Indica si otro miembro tiene bloqueado el perfil.",
                              "example": false
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "envId": "1800000000000001",
                    "locked": false
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/setGroup/batch": {
      "post": {
        "summary": "Asignar grupo a perfiles por lotes",
        "description": "Mueve perfiles de navegador a un grupo indicando el nombre del grupo.\n- **Requisitos previos**: indica al menos uno de `envIds` o `uniqueIds`; `groupName` es obligatorio y admite como máximo 50 caracteres. No hay forma de quitar el grupo de un perfil con este endpoint.\n- **Efecto**: el grupo se crea automáticamente cuando el nombre no existe, lo cual **cuenta para el límite de 1000 grupos por equipo** y falla una vez alcanzado. Un perfil pertenece exactamente a un grupo, así que el grupo anterior se reemplaza. Cuando tu equipo autoriza el acceso por grupo, un grupo creado aquí también se te concede a ti.\n- **Finalización**: sincrónica. La creación de grupos se serializa por equipo, así que llamadas simultáneas con un nombre nuevo no crean duplicados.",
        "operationId": "batchSetBrowserProfileGroupOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EnvIdsOrUniqueIds"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "groupName": {
                        "type": "string",
                        "description": "Nombre del grupo de destino. No puede estar vacío.",
                        "minLength": 1,
                        "example": "Marketing"
                      }
                    },
                    "required": [
                      "groupName"
                    ]
                  }
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001"
                ],
                "groupName": "Marketing"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/env/setProxy/batch": {
      "post": {
        "summary": "Asignar proxy a perfiles por lotes",
        "description": "Vincula un proxy a varios perfiles de navegador.\n- **Requisitos previos**: indica al menos uno de `envIds` o `uniqueIds`. Si indicas un `proxyId`, ya debe existir en el equipo; de lo contrario la llamada se rechaza en lugar de crear uno.\n- **Efecto**: escribe `proxyId` en cada perfil. Cuando `proxyId` se omite o es `0`, se reutiliza un proxy existente con datos de conexión idénticos y, si no hay coincidencia, **se crea un registro de proxy nuevo en el equipo que llama**.\n- **Finalización**: sincrónica. Los navegadores en ejecución conservan el proxy con el que arrancaron.\n- **Reintentos**: volver a vincular el mismo `proxyId` es idempotente, pero repetir una llamada que lleve datos de conexión en bruto puede crear otro registro de proxy cada vez que falle la deduplicación.\n\nErrores de negocio documentados: `19106`, `19193`, `14023`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "batchSetBrowserProfileProxyOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EnvIdsOrUniqueIds"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "proxy": {
                        "$ref": "#/components/schemas/ProxyInput"
                      }
                    }
                  }
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001"
                ],
                "proxy": {
                  "proxyIp": "127.0.0.1",
                  "proxyPort": 1080,
                  "proxyType": 2,
                  "proxyProvider": 0,
                  "username": "user",
                  "password": "pass"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/env/setRemark/batch": {
      "post": {
        "summary": "Asignar comentario a perfiles por lotes",
        "description": "Establece el comentario en varios perfiles de navegador. Una cadena vacía lo borra.\n- **Requisitos previos**: indica al menos uno de `envIds` o `uniqueIds`; quien llama debe estar autorizado para cada perfil.\n- **Efecto**: escribe únicamente el campo de comentario.\n- **Finalización**: sincrónica. Totalmente idempotente para el mismo cuerpo.",
        "operationId": "batchSetBrowserProfileRemarkOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EnvIdsOrUniqueIds"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "envRemark": {
                        "type": "string",
                        "description": "Nota del perfil. Una cadena vacía borra la nota.",
                        "example": "Managed by automation"
                      }
                    },
                    "required": [
                      "envRemark"
                    ]
                  }
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001"
                ],
                "envRemark": "Managed by automation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/cloudbrowser/start": {
      "post": {
        "summary": "Iniciar runtime en la nube",
        "description": "Inicia un perfil de navegador como runtime en la nube.\n- **Requisitos previos**: el perfil debe existir en tu equipo y no puede estar cifrado de extremo a extremo ni en proceso de transferencia. **Se exige un proxy** y su accesibilidad se comprueba antes de aceptar el inicio. El kernel del navegador debe ser uno que el navegador en la nube admita, lo que descarta Firefox. Se aplican los límites de apertura del equipo y, en despliegues con la facturación del navegador en la nube activada, también se comprueba el saldo de créditos de IA.\n- **Una ejecución por perfil**: un miembro solo puede tener una ejecución activa por perfil. Cuando el equipo activa el bloqueo de seguridad, la ejecución de otro miembro bloquea la tuya.\n- **Finalización**: **aceptado, no completado.** `data` está vacío; el runtime se aprovisiona de forma asíncrona. Consulta `/cloudbrowser/page` hasta que `cloudBrowserStatus` sea `RUNNING`, y después llama a `/cloudbrowser/connect` para obtener `cdpUrl`. Un inicio puede aceptarse y fallar más tarde, lo que se ve en esa página.\n- **Concurrencia**: los inicios simultáneos de un perfil se serializan con un bloqueo; el que pierde se rechaza en lugar de ponerse en cola.\n- **Reintentos**: tras un timeout, lee `/cloudbrowser/page`; no reenvíes.\n\nErrores de negocio documentados: `19039`, `19065`, `40001`, `40003`, `40015`, `40016`, `40021`, `40023`, `40024`, `40025`, `40026`, `40027`, `40028`, `40029`, `40037`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "startCloudRuntimeOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserStartRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/cloudbrowser/stop": {
      "post": {
        "summary": "Detener runtime en la nube",
        "description": "Detiene el runtime en la nube en el que se ejecuta un perfil.\n- **Requisitos previos**: debe existir una ejecución activa iniciada por ti para ese perfil. Llamarlo cuando el runtime ya está detenido o liberándose devuelve éxito sin hacer nada.\n- **Efecto**: detiene la facturación, liquida el consumo, libera el bloqueo del perfil y pide al cliente que archive el perfil y las cookies en la nube antes de liberar el runtime.\n- **Finalización**: **aceptado, no completado.** Consulta `/cloudbrowser/page` hasta que `cloudBrowserStatus` sea `CLOSED` y `cloudBrowserArchiveStatus` llegue a `COMPLETED` o `FAILED`.\n- **Cuando falla el archivado**: la ejecución sigue siendo facturable y continúa mostrándose como `RUNNING`. `force` **solo** se tiene en cuenta en ese estado: omite el archivado y libera el runtime, lo que descarta los cambios del perfil de esta sesión.\n- **Concurrencia**: las detenciones simultáneas de una misma ejecución se serializan, por lo que una llamada duplicada es segura.\n\nErrores de negocio documentados: `40002`, `40006`, `40008`, `40020`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "stopCloudRuntimeOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserStopRequest"
              },
              "example": {
                "envId": "1800000000000001",
                "force": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/cloudbrowser/page": {
      "post": {
        "summary": "Listar runtimes en la nube por páginas",
        "description": "Lista los perfiles de navegador junto con el estado del runtime en la nube para el miembro que llama.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Valores de estado**: `cloudBrowserStatus` solo puede ser `STARTING`, `RUNNING` o `CLOSED`. **`RUNNING` no significa que el navegador se pueda usar**: un runtime que se está deteniendo, que se está archivando o que falló al detenerse también se informa como `RUNNING`. `cloudBrowserArchiveStatus` (`PENDING`, `ARCHIVING`, `COMPLETED`, `FAILED`) distingue ambos casos y es null cuando no hay actividad.\n- **Consistencia**: la resolución del runtime es todo o nada. Si no se puede resolver para la página completa, la llamada falla en lugar de devolver datos parciales.",
        "operationId": "pageCloudRuntimesOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserPageRequest"
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "keyword": "marketing"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudBrowserPageResponse"
          }
        }
      }
    },
    "/cloudbrowser/connect": {
      "post": {
        "summary": "Conectar al runtime en la nube",
        "description": "Devuelve los datos de conexión de un runtime en la nube que está en ejecución.\n- **Requisitos previos**: el runtime debe estar exactamente en estado `RUNNING` y lo debes haber iniciado tú. Un runtime que se está deteniendo o archivando se rechaza aunque `/cloudbrowser/page` siga informando `RUNNING`.\n- **Efecto**: emite un token de acceso al escritorio nuevo y te registra como el miembro conectado.\n- **Llamadas repetidas**: el `cdpUrl` devuelto es estable y las sesiones CDP existentes siguen funcionando, pero cada llamada emite un token de escritorio nuevo y sobrescribe el miembro conectado registrado. **Las URL de escritorio anteriores no se revocan**, así que trata cada URL devuelta como una credencial activa: no las registres en logs ni las persistas.\n- **Límite de sesión**: el runtime se detiene automáticamente al alcanzar su duración máxima, y el archivado empieza algo antes, por lo que una automatización de larga duración debe contemplar que el runtime desaparezca.\n- **Uso**: conecta Puppeteer, Playwright o Selenium a `cdpUrl`.\n\nErrores de negocio documentados: `40008`, `40009`, `40010`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "connectCloudRuntimeOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserConnectRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudBrowserConnectResponse"
          }
        }
      }
    },
    "/env/advanced/ua/versions": {
      "post": {
        "summary": "Obtener la lista de versiones de kernel del navegador",
        "description": "Devuelve los kernels de navegador publicados y las versiones principales de user agent.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Contenido**: la superficie Open API devuelve solo kernels publicados, mientras que la superficie Local API filtra por la versión del cliente en ejecución, así que ambas superficies pueden devolver conjuntos distintos. La lista cambia a medida que se publican kernels nuevos.\n- **Nota**: un fallo aguas arriba produce una lista vacía en lugar de un error, así que trata un resultado vacío como no concluyente.\n- **Open API**: se devuelven solo kernels publicados, con independencia de cualquier cliente.",
        "operationId": "listKernelVersionsOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "systemType": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  },
                  "systemBitType": {
                    "$ref": "#/components/schemas/SystemBitType"
                  },
                  "architecture": {
                    "$ref": "#/components/schemas/Architecture"
                  }
                }
              },
              "example": {
                "systemType": 1,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "browserType": {
                                "$ref": "#/components/schemas/BrowserType"
                              },
                              "versions": {
                                "type": "array",
                                "description": "Versiones principales de UA y núcleo publicadas para este tipo de navegador.",
                                "items": {
                                  "type": "integer"
                                },
                                "example": [
                                  124,
                                  123
                                ]
                              }
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": [
                    {
                      "browserType": 1,
                      "versions": [
                        124,
                        123
                      ]
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/env/advanced/ua/get": {
      "post": {
        "summary": "Obtener el user agent del navegador",
        "description": "Genera un user agent que coincide con el sistema operativo y el fabricante de navegador solicitados.\n- **Requisitos previos**: Firefox solo es válido con Windows o macOS, y `osVersion` debe ser una de las versiones admitidas.\n- **Efecto**: ninguno, pero **el resultado no es determinista**: la misma petición devuelve un user agent distinto cada vez. No lo uses como clave de caché.\n- **Finalización**: sincrónica. Es seguro reintentar.\n- **Open API**: para construir el user agent solo se usan kernels publicados; no se lee ninguna información del cliente.",
        "operationId": "getUserAgentOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "os": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  },
                  "osVersion": {
                    "type": "string",
                    "description": "Versión del sistema operativo. Por defecto es una cadena vacía.\n",
                    "enum": [
                      "",
                      "Windows 7",
                      "Windows 8",
                      "Windows 10",
                      "Windows 11",
                      "macOS 12",
                      "macOS 13",
                      "macOS 14"
                    ],
                    "example": "Windows 11"
                  },
                  "vendor": {
                    "$ref": "#/components/schemas/BrowserType"
                  },
                  "mobileDevice": {
                    "type": "string",
                    "description": "ID del modelo de dispositivo móvil. Se usa en perfiles de Android e iOS.",
                    "example": "pixel_8"
                  },
                  "systemBitType": {
                    "$ref": "#/components/schemas/SystemBitType"
                  },
                  "architecture": {
                    "$ref": "#/components/schemas/Architecture"
                  }
                },
                "required": [
                  "os",
                  "vendor"
                ]
              },
              "example": {
                "os": 1,
                "osVersion": "Windows 11",
                "vendor": 1,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "ua": {
                              "type": "string",
                              "description": "User agent emparejado.",
                              "example": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
                            },
                            "resolution": {
                              "$ref": "#/components/schemas/Resolution"
                            },
                            "mobileDevice": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "ID del modelo de dispositivo móvil. Vacío en los perfiles de escritorio.",
                              "example": null
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
                    "resolution": {
                      "id": "1920_1080",
                      "value": "1920x1080"
                    },
                    "mobileDevice": null
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/base/resolution/list": {
      "post": {
        "summary": "Obtener la lista de resoluciones",
        "description": "Devuelve las resoluciones de pantalla disponibles para un user agent o un sistema operativo.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Contenido**: se sirve desde el servicio de datos base de huellas, así que la lista cambia a medida que se actualizan esos datos.",
        "operationId": "listResolutionsOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ua": {
                    "type": "string",
                    "description": "User agent que se usa para emparejar resoluciones.",
                    "example": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
                  },
                  "os": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  }
                }
              },
              "example": {
                "os": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. Devuelve un array vacío cuando no hay coincidencias.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Resolution"
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": [
                    {
                      "id": "1920_1080",
                      "value": "1920x1080"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/env/base/list": {
      "post": {
        "summary": "Obtener la lista de zonas horarias e idiomas",
        "description": "Devuelve las zonas horarias y los idiomas disponibles para los perfiles de navegador.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Nota**: actualmente la respuesta es independiente del cuerpo de la petición: el servicio no reenvía aguas abajo el sistema operativo ni el idioma solicitados, así que se devuelve la misma lista con independencia de la entrada.",
        "operationId": "listTimezonesAndLanguagesOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "os": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/OperatingSystem"
                      }
                    ],
                    "default": 1
                  }
                }
              },
              "example": {
                "os": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. Las listas vacías se devuelven como arrays vacíos.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "time_zone_list": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/IdValueOption"
                              }
                            },
                            "language_list": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/IdValueOption"
                              }
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "time_zone_list": [
                      {
                        "id": "America/Los_Angeles",
                        "value": "(GMT-08:00) America/Los_Angeles"
                      }
                    ],
                    "language_list": [
                      {
                        "id": "en-US",
                        "value": "English (United States)"
                      }
                    ]
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            }
          }
        }
      }
    },
    "/env/base/mobile/devices": {
      "post": {
        "summary": "Obtener la lista de modelos de teléfono",
        "description": "Devuelve los modelos de dispositivo móvil disponibles para los perfiles de navegador de Android e iOS.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Contenido**: la intersección entre la tabla de dispositivos de MoreLogin y el servicio de datos base de huellas. Los modelos presentes en solo uno de los dos se omiten, y el `id` devuelto pertenece al servicio de huellas, no a la tabla de dispositivos.",
        "operationId": "listMobileDevicesOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "responses": {
          "200": {
            "description": "Correcto. Devuelve un array vacío cuando no hay modelos disponibles.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/MobileDevice"
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": [
                    {
                      "id": "pixel_8",
                      "name": "Pixel 8",
                      "resolution": "1080x2400",
                      "os": 3,
                      "platform": "Android"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/env/fingerprint/refresh": {
      "post": {
        "summary": "Regenerar la huella del perfil",
        "description": "Regenera la huella de un perfil de navegador.\n- **Requisitos previos**: identifica el perfil con `envId` o `uniqueId`. Los perfiles cifrados se rechazan. Un perfil en ejecución no se bloquea, pero la huella nueva se aplica a partir del siguiente arranque.\n- **Efecto**: genera una huella nueva, aleatoriza el nombre de host y la dirección MAC, y vuelve a emparejar el kernel del navegador. Los valores indicados en la petición prevalecen sobre los generados.\n- **Finalización**: sincrónica.\n- **Reintentos**: **nunca reintentes automáticamente.** Cada llamada produce una huella aleatoria distinta, así que un reintento a ciegas tras un timeout cambia el perfil una segunda vez. Compara antes con `/env/detail`.\n- **Open API**: el sistema operativo de la petición tiene prioridad; cuando se omite, se usa el que está guardado en el perfil para elegir un kernel publicado. No se lee ninguna información del cliente.\n\nErrores de negocio documentados: `19039`, `19104`, `19105`, `19106`, `19107`, `19108`, `19111`, `19142`, `19193`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "refreshFingerprintOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envId": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/EnvironmentId"
                      }
                    ],
                    "description": "ID del perfil. Indique este o `uniqueId`."
                  },
                  "uniqueId": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Número de secuencia del perfil. Indique este o `envId`.",
                    "example": 1001
                  },
                  "browserCore": {
                    "type": "integer",
                    "description": "Versión principal del núcleo. Si es `0` o se omite, se empareja automáticamente.",
                    "minimum": 0,
                    "example": 124
                  },
                  "uaVersion": {
                    "type": "integer",
                    "description": "Versión principal del UA. Si es `0` o se omite, se actualiza según las reglas de negocio.",
                    "minimum": 0,
                    "example": 124
                  },
                  "browserTypeId": {
                    "$ref": "#/components/schemas/BrowserType"
                  },
                  "operatorSystemId": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  },
                  "systemBitType": {
                    "$ref": "#/components/schemas/SystemBitType"
                  },
                  "architecture": {
                    "$ref": "#/components/schemas/Architecture"
                  },
                  "advancedSetting": {
                    "$ref": "#/components/schemas/AdvancedSetting"
                  }
                }
              },
              "example": {
                "envId": "1800000000000001",
                "browserCore": 124,
                "uaVersion": 124,
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/env/cache/cleanCloud": {
      "post": {
        "summary": "Borrar caché del perfil en la nube",
        "description": "Borra la caché del lado de la nube de un perfil de navegador.\n- **Requisitos previos**: identifica el perfil con `envId` o `uniqueId`, selecciona al menos una clase de caché, y el perfil no puede estar en proceso de transferencia. La caché local del cliente no se toca.\n- **Efecto**: borrar la clase general elimina LocalStorage, IndexedDB y datos de extensiones en la nube, desvincula las extensiones del perfil y **restablece el tipo de cifrado del perfil**; borrar las cookies restablece el tipo de cifrado de las cookies. Ambos cambios se persisten, así que un perfil cifrado queda sin cifrar para la clase borrada.\n- **Finalización**: sincrónica; el servicio de almacenamiento en la nube ya ha aceptado y respondido antes de la respuesta. No hay ningún identificador de tarea que consultar.\n\nErrores de negocio documentados: `19039`, `19149`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "cleanCloudCacheOpenApi",
        "tags": [
          "Cache"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envId": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/EnvironmentId"
                      }
                    ],
                    "description": "ID del perfil. Indique este o `uniqueId`."
                  },
                  "uniqueId": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Número de secuencia del perfil. Indique este o `envId`.",
                    "minimum": 1,
                    "example": 1001
                  },
                  "others": {
                    "type": "boolean",
                    "description": "Indica si se borran otros datos de caché en la nube.",
                    "example": true
                  },
                  "cookie": {
                    "type": "boolean",
                    "description": "Indica si se borran las cookies en la nube.",
                    "example": false
                  }
                }
              },
              "example": {
                "envId": "1800000000000001",
                "others": true,
                "cookie": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "OpenApiBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "Token de acceso OAuth2 obtenido en `/oauth2/token`. Envíalo como `Authorization: Bearer <token>`.\nLos tokens caducan a los 3600 segundos.\n"
      }
    },
    "schemas": {
      "OperatingSystem": {
        "type": "integer",
        "description": "Sistema operativo:\n- `1` — Windows\n- `2` — macOS\n- `3` — Android\n- `4` — iOS\n- `5` — Linux\n",
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "example": 1
      },
      "BrowserType": {
        "type": "integer",
        "description": "Tipo de navegador:\n- `1` — Chrome\n- `2` — Firefox\n",
        "enum": [
          1,
          2
        ],
        "example": 1
      },
      "SystemBitType": {
        "type": "integer",
        "description": "Arquitectura del sistema. Por defecto `1`:\n- `0` — 32 bits\n- `1` — 64 bits\n",
        "enum": [
          0,
          1
        ],
        "default": 1,
        "example": 1
      },
      "Architecture": {
        "type": "integer",
        "description": "Arquitectura de CPU. Por defecto `0`:\n- `0` — x86\n- `1` — ARM\n",
        "enum": [
          0,
          1
        ],
        "default": 0,
        "example": 0
      },
      "ToggleFlag": {
        "type": "integer",
        "description": "Valor del interruptor:\n- `0` — desactivado\n- `1` — activado\n",
        "enum": [
          0,
          1
        ],
        "example": 0
      },
      "ProxyType": {
        "type": "integer",
        "description": "Protocolo del proxy:\n- `0` — HTTP\n- `1` — HTTPS\n- `2` — SOCKS5\n- `3` — SSH\n",
        "enum": [
          0,
          1,
          2,
          3
        ],
        "example": 2
      },
      "ProxyProvider": {
        "type": "integer",
        "description": "Tipo de proxy. De `0` a `3` indican un proxy simple del protocolo correspondiente; `4` y superiores identifican un\nservicio comercial:\n- `0` — HTTP\n- `1` — HTTPS\n- `2` — SOCKS5\n- `3` — SSH\n- `4` — Oxylabs\n- `5` — Proxys.io\n- `6` — GeoSurf\n- `7` — Luminati\n- `8` — Lumauto\n- `9` — Oxylabsauto\n- `10` — Trojan\n- `11` — Shadowsocks\n- `12` — vmess\n- `13` — ABCProxy\n- `14` — LunaProxy\n- `15` — IPHTML\n- `16` — PiaProxy\n- `17` — 922S5\n- `18` — 360Proxy\n\nTrata los valores futuros desconocidos como un servicio comercial genérico.\n",
        "example": 0
      },
      "AdvancedSetting": {
        "type": "object",
        "description": "Configuración dinámica de huella. Las claves provienen del protocolo de ajustes avanzados del perfil;\ncada valor puede ser una cadena, un número, un booleano, un array o un objeto según la clave.\n",
        "additionalProperties": true,
        "example": {
          "language": "en-US",
          "timezone": "America/Los_Angeles"
        }
      },
      "ProxyInput": {
        "type": "object",
        "description": "Datos de conexión del proxy. Cuando `proxyId` se refiere a un proxy existente, se reutiliza ese proxy;\nen caso contrario se crea un proxy nuevo a partir de estos campos.\n",
        "properties": {
          "proxyId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de un proxy existente.",
            "example": "1800000000000101"
          },
          "proxyIp": {
            "type": "string",
            "description": "Host o dirección IP del proxy.",
            "example": "127.0.0.1"
          },
          "proxyPort": {
            "type": "integer",
            "description": "Puerto del proxy.",
            "minimum": 1,
            "maximum": 65535,
            "example": 1080
          },
          "proxyName": {
            "type": "string",
            "description": "Nombre del proxy.",
            "maxLength": 600,
            "example": "proxy-a"
          },
          "proxyType": {
            "$ref": "#/components/schemas/ProxyType"
          },
          "proxyProvider": {
            "$ref": "#/components/schemas/ProxyProvider"
          },
          "ipMonitor": {
            "type": "boolean",
            "description": "Si se deben supervisar los cambios de la IP de salida.",
            "example": true
          },
          "ipChangeAction": {
            "type": "integer",
            "description": "Acción que se toma cuando cambia la IP de salida.",
            "example": 0
          },
          "username": {
            "type": "string",
            "description": "Usuario del proxy.",
            "maxLength": 200,
            "example": "user"
          },
          "password": {
            "type": "string",
            "description": "Contraseña del proxy.",
            "maxLength": 100,
            "example": "pass"
          },
          "refreshUrl": {
            "type": "string",
            "description": "URL de actualización del proxy.",
            "example": "https://example.com/refresh"
          },
          "encryptionType": {
            "type": "integer",
            "description": "Tipo de cifrado del proxy.",
            "example": 0
          },
          "country": {
            "type": "string",
            "description": "País o región.",
            "example": "US"
          },
          "state": {
            "type": "string",
            "description": "Estado o provincia.",
            "example": "CA"
          },
          "city": {
            "type": "string",
            "description": "Ciudad.",
            "example": "Los Angeles"
          }
        }
      },
      "AccountInfo": {
        "type": "object",
        "description": "Cuenta de plataforma vinculada al perfil.",
        "properties": {
          "username": {
            "type": "string",
            "description": "Nombre de usuario de la cuenta de plataforma.",
            "maxLength": 64,
            "example": "account@example.com"
          },
          "password": {
            "type": "string",
            "description": "Contraseña de la cuenta de plataforma.",
            "maxLength": 50,
            "example": "secret"
          },
          "siteId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID del sitio.",
            "example": "1800000000000201"
          },
          "platformId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de la plataforma. `9999` significa una plataforma personalizada.",
            "example": "9999"
          },
          "customerUrl": {
            "type": "string",
            "description": "URL de plataforma personalizada. Obligatoria cuando `platformId` es `9999`. Debe ser una URL válida.",
            "example": "https://example.com"
          },
          "otpSecret": {
            "type": "string",
            "description": "Secreto de la autenticación en dos pasos (2FA).",
            "example": "BASE32SECRET"
          }
        },
        "required": [
          "platformId"
        ]
      },
      "AfterStartupConfigInput": {
        "type": "object",
        "description": "Comportamiento aplicado tras iniciar el navegador.",
        "properties": {
          "afterStartup": {
            "type": "integer",
            "description": "Comportamiento de arranque. Por defecto `1`:\n- `1` — volver a abrir las páginas de la última sesión\n- `2` — abrir las páginas indicadas\n- `3` — abrir las páginas indicadas y la plataforma\n- `4` — volver a abrir las páginas de la última sesión y la plataforma\n",
            "enum": [
              1,
              2,
              3,
              4
            ],
            "default": 1,
            "example": 2
          },
          "autoOpenUrls": {
            "type": "array",
            "description": "Páginas que se abrirán automáticamente. Cada entrada debe ser una URL válida.",
            "items": {
              "type": "string"
            },
            "example": [
              "https://example.com"
            ]
          },
          "stayOnCheckIPPage": {
            "type": "boolean",
            "description": "Si se debe permanecer en la página de comprobación de IP tras el arranque.",
            "example": false
          }
        }
      },
      "AfterStartupConfigDetail": {
        "type": "object",
        "description": "Comportamiento aplicado tras iniciar el navegador, tal como está guardado en el perfil.",
        "properties": {
          "afterStartup": {
            "type": "integer",
            "description": "Comportamiento de arranque. De `1` a `4`.",
            "enum": [
              1,
              2,
              3,
              4
            ],
            "example": 2
          },
          "autoOpenUrls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "https://example.com"
            ]
          },
          "platformUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL de la plataforma que se abre tras el arranque.",
            "example": "https://platform.example.com"
          }
        }
      },
      "TagInfo": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de la etiqueta.",
            "example": "1800000000000301"
          },
          "tagName": {
            "type": "string",
            "description": "Nombre de la etiqueta.",
            "example": "important"
          }
        }
      },
      "ProxyInfoDetail": {
        "type": "object",
        "description": "Proxy vinculado actualmente al perfil.",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID del proxy.",
            "example": "1800000000000101"
          },
          "proxyName": {
            "type": "string",
            "description": "Nombre del proxy.",
            "example": "proxy-a"
          },
          "proxyType": {
            "$ref": "#/components/schemas/ProxyType"
          },
          "proxyProvider": {
            "$ref": "#/components/schemas/ProxyProvider"
          },
          "proxyCategoryType": {
            "type": "integer",
            "description": "Categoría del proxy:\n- `1` — plataforma en la nube\n- `2` — IP propia\n",
            "enum": [
              1,
              2
            ],
            "example": 2
          },
          "proxyCheckStatus": {
            "type": "integer",
            "description": "Estado de la comprobación de conectividad:\n- `0` — pendiente\n- `1` — correcta\n- `2` — fallida\n- `3` — error desconocido\n",
            "enum": [
              0,
              1,
              2,
              3
            ],
            "example": 1
          },
          "proxyStatus": {
            "type": "integer",
            "description": "Estado del proxy:\n- `0` — normal\n- `1` — pendiente de asignación\n- `2` — actualizando\n- `3` — caducado\n",
            "enum": [
              0,
              1,
              2,
              3
            ],
            "example": 0
          },
          "state": {
            "type": [
              "string",
              "null"
            ],
            "description": "Estado o provincia del proxy. Se prioriza la ubicación detectada de la IP de salida y después la configurada; puede ser null o una cadena vacía.",
            "example": "California"
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ciudad del proxy. Se prioriza la ubicación detectada de la IP de salida y después la configurada; puede ser null o una cadena vacía.",
            "example": "Los Angeles"
          },
          "proxyPort": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Puerto de conexión del proxy; no se deduce del nombre. Puede ser null si no está disponible.",
            "example": 1080
          },
          "proxyIp": {
            "type": "string",
            "description": "Host o dirección IP del proxy.",
            "example": "127.0.0.1"
          },
          "exportIp": {
            "type": [
              "string",
              "null"
            ],
            "description": "Dirección IP de salida.",
            "example": "203.0.113.10"
          },
          "countryCode": {
            "type": [
              "string",
              "null"
            ],
            "description": "Código de país.",
            "example": "US"
          },
          "expiryTime": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "Fecha de caducidad como marca de tiempo Unix en milisegundos.",
            "example": "1786320000000"
          },
          "username": {
            "type": [
              "string",
              "null"
            ],
            "description": "Usuario del proxy.",
            "example": "user"
          },
          "password": {
            "type": [
              "string",
              "null"
            ],
            "description": "Contraseña del proxy.",
            "example": "pass"
          },
          "refreshUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL de actualización del proxy.",
            "example": "https://example.com/refresh"
          }
        }
      },
      "Resolution": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID de la resolución.",
            "example": "1920_1080"
          },
          "value": {
            "type": "string",
            "description": "Valor mostrado.",
            "example": "1920x1080"
          }
        }
      },
      "IdValueOption": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID de la opción.",
            "example": "en-US"
          },
          "value": {
            "type": "string",
            "description": "Valor mostrado.",
            "example": "English (United States)"
          }
        }
      },
      "MobileDevice": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del modelo de dispositivo.",
            "example": "pixel_8"
          },
          "name": {
            "type": "string",
            "description": "Nombre del modelo de dispositivo.",
            "example": "Pixel 8"
          },
          "resolution": {
            "type": "string",
            "description": "Resolución del dispositivo.",
            "example": "1080x2400"
          },
          "os": {
            "type": "integer",
            "description": "Sistema operativo:\n- `3` — Android\n- `4` — iOS\n",
            "enum": [
              3,
              4
            ],
            "example": 3
          },
          "platform": {
            "type": "string",
            "description": "Nombre de la plataforma.",
            "example": "Android"
          }
        }
      },
      "EnvIdRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "EnvIdsOrUniqueIds": {
        "type": "object",
        "description": "Perfiles de destino. Indica al menos uno de `envIds` o `uniqueIds`.",
        "properties": {
          "envIds": {
            "type": "array",
            "description": "ID de perfiles.",
            "items": {
              "$ref": "#/components/schemas/EnvironmentId"
            }
          },
          "uniqueIds": {
            "type": "array",
            "description": "Números de secuencia de los perfiles.",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "example": [
              1001
            ]
          }
        }
      },
      "QuickCreateRequest": {
        "type": "object",
        "properties": {
          "quantity": {
            "type": "integer",
            "description": "Número de perfiles que se crearán.",
            "minimum": 1,
            "maximum": 200,
            "example": 1
          },
          "browserTypeId": {
            "$ref": "#/components/schemas/BrowserType"
          },
          "operatorSystemId": {
            "$ref": "#/components/schemas/OperatingSystem"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo existente. `0` significa sin grupo.",
            "example": "0"
          },
          "groupName": {
            "type": "string",
            "description": "Nombre del grupo. Cuando se indica, el grupo se busca o se crea automáticamente.\n",
            "maxLength": 50,
            "example": "Marketing"
          },
          "isEncrypt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se debe cifrar el perfil. Por defecto `0`:\n- `0` — sin cifrar\n- `1` — cifrado\n"
          },
          "browserCore": {
            "type": "integer",
            "description": "Versión principal del kernel. Por defecto `0`, que selecciona automáticamente un kernel publicado.",
            "minimum": 0,
            "example": 0
          },
          "systemBitType": {
            "$ref": "#/components/schemas/SystemBitType"
          },
          "architecture": {
            "$ref": "#/components/schemas/Architecture"
          },
          "proxy": {
            "$ref": "#/components/schemas/ProxyInput"
          }
        },
        "required": [
          "quantity",
          "browserTypeId",
          "operatorSystemId"
        ]
      },
      "AdvancedCreateRequest": {
        "type": "object",
        "properties": {
          "envName": {
            "type": "string",
            "description": "Nombre del perfil.",
            "maxLength": 100,
            "example": "marketing-01"
          },
          "browserTypeId": {
            "$ref": "#/components/schemas/BrowserType"
          },
          "operatorSystemId": {
            "$ref": "#/components/schemas/OperatingSystem"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo existente. `0` significa sin grupo.",
            "example": "0"
          },
          "groupName": {
            "type": "string",
            "description": "Nombre del grupo. Al indicarlo, el grupo se busca o se crea automáticamente.",
            "maxLength": 50,
            "example": "Marketing"
          },
          "tagIds": {
            "type": "array",
            "description": "ID de etiquetas. Un array vacío significa sin etiquetas.",
            "items": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "example": [
              "1800000000000301"
            ]
          },
          "proxyId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de proxy existente. `0` significa sin proxy.",
            "example": "0"
          },
          "proxy": {
            "$ref": "#/components/schemas/ProxyInput"
          },
          "isEncrypt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se debe cifrar el perfil. Por defecto `0`."
          },
          "envRemark": {
            "type": "string",
            "description": "Comentario del perfil.",
            "maxLength": 1500,
            "example": "Created through the Open API"
          },
          "uaVersion": {
            "type": "integer",
            "description": "Versión principal del UA. Por defecto `0`, que significa cualquiera.",
            "minimum": 0,
            "example": 124
          },
          "browserCore": {
            "type": "integer",
            "description": "Versión principal del kernel. Por defecto `0`, que selecciona automáticamente un kernel publicado.",
            "minimum": 0,
            "example": 124
          },
          "systemBitType": {
            "$ref": "#/components/schemas/SystemBitType"
          },
          "architecture": {
            "$ref": "#/components/schemas/Architecture"
          },
          "accountInfo": {
            "$ref": "#/components/schemas/AccountInfo"
          },
          "isShowAccount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Interruptor de protección con contraseña."
          },
          "afterStartupConfig": {
            "$ref": "#/components/schemas/AfterStartupConfigInput"
          },
          "startupParams": {
            "type": "array",
            "description": "Parámetros de arranque del navegador.",
            "items": {
              "type": "string"
            },
            "example": [
              "--disable-notifications"
            ]
          },
          "cookies": {
            "type": "string",
            "description": "Cookies como carga de texto JSON.",
            "example": "[{\"name\":\"sid\",\"value\":\"abc\"}]"
          },
          "advancedSetting": {
            "$ref": "#/components/schemas/AdvancedSetting"
          },
          "disableAudio": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se bloquea la reproducción de audio."
          },
          "disableVideo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se bloquea la carga de vídeo."
          },
          "disableImg": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se bloquea la carga de imágenes."
          },
          "imgLimitSize": {
            "type": "integer",
            "description": "Tamaño máximo de imagen que se carga, en KB.",
            "minimum": 0,
            "maximum": 100000,
            "example": 1000
          }
        },
        "required": [
          "browserTypeId",
          "operatorSystemId"
        ]
      },
      "UpdateRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnvironmentId"
              }
            ],
            "description": "ID del perfil. La solicitud también acepta el alias de campo `id`."
          },
          "envName": {
            "type": "string",
            "description": "Nombre del perfil.",
            "maxLength": 100,
            "example": "marketing-01-updated"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo. `0` significa sin grupo.",
            "example": "0"
          },
          "groupName": {
            "type": "string",
            "description": "Nombre del grupo. Al indicarlo, el grupo se busca o se crea automáticamente.",
            "maxLength": 50,
            "example": "Marketing"
          },
          "tagIds": {
            "type": "array",
            "description": "ID de etiquetas.",
            "items": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "example": [
              "1800000000000301"
            ]
          },
          "proxyId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de proxy existente. `0` significa sin proxy.",
            "example": "0"
          },
          "envRemark": {
            "type": "string",
            "description": "Comentario del perfil.",
            "maxLength": 1500,
            "example": "Updated through the Open API"
          },
          "uaVersion": {
            "type": "integer",
            "description": "Versión principal del UA.",
            "minimum": 0,
            "example": 124
          },
          "browserCore": {
            "type": "integer",
            "description": "Versión principal del kernel.",
            "minimum": 0,
            "example": 124
          },
          "systemBitType": {
            "$ref": "#/components/schemas/SystemBitType"
          },
          "architecture": {
            "$ref": "#/components/schemas/Architecture"
          },
          "accountInfo": {
            "$ref": "#/components/schemas/AccountInfo"
          },
          "isShowAccount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Interruptor de protección con contraseña."
          },
          "afterStartupConfig": {
            "$ref": "#/components/schemas/AfterStartupConfigInput"
          },
          "startupParams": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "--disable-notifications"
            ]
          },
          "cookies": {
            "type": "string",
            "description": "Cookies como carga de texto JSON.",
            "example": "[{\"name\":\"sid\",\"value\":\"abc\"}]"
          },
          "advancedSetting": {
            "$ref": "#/components/schemas/AdvancedSetting"
          },
          "disableAudio": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se bloquea la reproducción de audio."
          },
          "disableVideo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se bloquea la carga de vídeo."
          },
          "disableImg": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si se bloquea la carga de imágenes."
          },
          "imgLimitSize": {
            "type": "integer",
            "description": "Tamaño máximo de imagen que se carga, en KB.",
            "minimum": 0,
            "maximum": 100000,
            "example": 1000
          },
          "hostnameSource": {
            "type": "integer",
            "description": "Origen del nombre del dispositivo:\n- `0` — personalizado\n- `1` — real\n",
            "enum": [
              0,
              1
            ],
            "example": 0
          },
          "hostname": {
            "type": "string",
            "description": "Nombre del dispositivo. Se usa cuando `hostnameSource` es `0`.",
            "example": "DESKTOP-OPENAPI"
          },
          "macAddressSource": {
            "type": "integer",
            "description": "Origen de la dirección MAC:\n- `0` — personalizada\n- `1` — real\n",
            "enum": [
              0,
              1
            ],
            "example": 0
          },
          "macAddress": {
            "type": "string",
            "description": "Dirección MAC. Se usa cuando `macAddressSource` es `0`.",
            "example": "00:16:3E:12:34:56"
          }
        },
        "required": [
          "envId"
        ]
      },
      "EnvPageRequest": {
        "type": "object",
        "properties": {
          "uniqueIds": {
            "type": "array",
            "description": "Números de secuencia de los perfiles. Hasta 100 elementos.",
            "maxItems": 100,
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "example": [
              1001
            ]
          },
          "envId": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnvironmentId"
              }
            ],
            "description": "ID del perfil. La solicitud también acepta el alias de campo `id`."
          },
          "envName": {
            "type": "string",
            "description": "Nombre del perfil.",
            "example": "marketing-01"
          },
          "keyword": {
            "type": "string",
            "description": "Filtro por palabra clave. Coincide con el nombre del perfil, el nombre del grupo, el nombre de la etiqueta y el comentario.",
            "example": "marketing"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo. `0` significa sin grupo.",
            "example": "0"
          },
          "pageSize": {
            "type": "integer",
            "format": "int64",
            "description": "Número de elementos por página.",
            "minimum": 1,
            "maximum": 100,
            "default": 10,
            "example": 10
          },
          "pageNo": {
            "type": "integer",
            "format": "int64",
            "description": "Número de la página actual, empezando por 1.",
            "minimum": 1,
            "default": 1,
            "example": 1
          },
          "onlyMainAccount": {
            "type": "boolean",
            "description": "Si se deben devolver solo los perfiles cuyo propietario es la cuenta principal.",
            "example": false
          }
        },
        "required": [
          "pageNo",
          "pageSize"
        ]
      },
      "EnvListItem": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "envName": {
            "type": "string",
            "description": "Nombre del perfil.",
            "example": "marketing-01"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo. `0` significa sin grupo.",
            "example": "0"
          },
          "groupName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nombre del grupo.",
            "example": "Marketing"
          },
          "tagInfos": {
            "type": "array",
            "description": "Etiquetas del perfil. Array vacío cuando no hay ninguna.",
            "items": {
              "$ref": "#/components/schemas/TagInfo"
            }
          },
          "envRemark": {
            "type": [
              "string",
              "null"
            ],
            "description": "Comentario del perfil.",
            "example": "Created through the Open API"
          },
          "proxyId": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "ID del proxy vinculado al perfil.",
            "example": "1800000000000101"
          },
          "proxy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProxyInfoDetail"
              },
              {
                "type": "null"
              }
            ],
            "description": "Datos del proxy. `null` cuando no hay ningún proxy vinculado."
          }
        }
      },
      "EnvPageData": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Número total de registros.",
            "example": "1"
          },
          "current": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Número de la página actual.",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Número total de páginas.",
            "example": "1"
          },
          "dataList": {
            "type": "array",
            "description": "Perfiles de la página actual. Array vacío cuando no hay resultados.",
            "items": {
              "$ref": "#/components/schemas/EnvListItem"
            }
          }
        },
        "required": [
          "total",
          "current",
          "pages",
          "dataList"
        ]
      },
      "EnvDetail": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "envName": {
            "type": "string",
            "description": "Nombre del perfil.",
            "example": "marketing-01"
          },
          "browserTypeId": {
            "$ref": "#/components/schemas/BrowserType"
          },
          "operatorSystemId": {
            "$ref": "#/components/schemas/OperatingSystem"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo. `0` significa sin grupo.",
            "example": "0"
          },
          "groupName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nombre del grupo.",
            "example": "Marketing"
          },
          "tagIds": {
            "type": "array",
            "description": "ID de etiquetas.",
            "items": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "example": [
              "1800000000000301"
            ]
          },
          "tagInfos": {
            "type": "array",
            "description": "Etiquetas del perfil. Array vacío cuando no hay ninguna.",
            "items": {
              "$ref": "#/components/schemas/TagInfo"
            }
          },
          "proxyId": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "ID del proxy vinculado al perfil.",
            "example": "1800000000000101"
          },
          "isEncrypt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Si el perfil está cifrado."
          },
          "envRemark": {
            "type": [
              "string",
              "null"
            ],
            "description": "Comentario del perfil.",
            "example": "Created through the Open API"
          },
          "uaVersion": {
            "type": "integer",
            "description": "Versión principal del UA.",
            "example": 124
          },
          "browserCore": {
            "type": "integer",
            "description": "Versión principal del kernel.",
            "example": 124
          },
          "accountInfo": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/AccountInfo"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cuenta de plataforma vinculada al perfil. `null` cuando no hay ninguna configurada."
          },
          "isShowAccount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Interruptor de protección con contraseña."
          },
          "afterStartupConfig": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/AfterStartupConfigDetail"
              },
              {
                "type": "null"
              }
            ],
            "description": "Comportamiento aplicado tras iniciar el navegador."
          },
          "startupParams": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "--disable-notifications"
            ]
          },
          "cookies": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cookies como carga de texto JSON.",
            "example": "[{\"name\":\"sid\",\"value\":\"abc\"}]"
          },
          "advancedSetting": {
            "$ref": "#/components/schemas/AdvancedSetting"
          }
        }
      },
      "ApiResponseBase": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Return result code. `0` means success; other codes indicate exceptions.",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Error message. Usually `null` on success.",
            "example": null
          },
          "requestId": {
            "type": "string",
            "description": "Operation request ID. This field may be present when the request passes through the API gateway.",
            "example": "1d4f3ea968664593860b94b35d4ebf5e"
          }
        },
        "required": [
          "code",
          "msg"
        ]
      },
      "EnvironmentId": {
        "type": "string",
        "pattern": "^[1-9]\\d*$",
        "description": "Browser profile (environment) ID. Serialized as a decimal string to avoid JavaScript\nprecision loss on 64-bit integers.\n",
        "example": "1800000000000001"
      },
      "CloudBrowserStartRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserStopRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "force": {
            "type": "boolean",
            "description": "Whether to forcibly release the cloud runtime. Only takes effect when the current run has\nan archive status of `FAILED`; in that case the archive step is skipped and runtime\nresources are reclaimed. Ignored in all other cases.\n",
            "default": false,
            "example": false
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserPageRequest": {
        "type": "object",
        "properties": {
          "uniqueIds": {
            "type": "array",
            "description": "Environment sequence numbers. Up to 100 items.",
            "maxItems": 100,
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "example": [
              1001,
              1002
            ]
          },
          "envId": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnvironmentId"
              }
            ],
            "description": "Environment ID. The request also accepts the field alias `id`."
          },
          "envName": {
            "type": "string",
            "description": "Environment name.",
            "example": "marketing-01"
          },
          "keyword": {
            "type": "string",
            "description": "Keyword filter. Matches environment name, group name, tag name, and remark.",
            "example": "marketing"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Group ID. `0` means ungrouped.",
            "example": "0"
          },
          "pageNo": {
            "type": "integer",
            "format": "int64",
            "description": "Current page number, starting from 1. Default is 1.",
            "minimum": 1,
            "default": 1,
            "example": 1
          },
          "pageSize": {
            "type": "integer",
            "format": "int64",
            "description": "Number of items per page. Default is 10, maximum 100.",
            "minimum": 1,
            "maximum": 100,
            "default": 10,
            "example": 10
          }
        },
        "required": [
          "pageNo",
          "pageSize"
        ]
      },
      "CloudBrowserStatus": {
        "type": "string",
        "description": "Cloud runtime status:\n- `STARTING` — starting up\n- `RUNNING` — running and ready to connect\n- `CLOSED` — not started, closed, or failed to start\n",
        "enum": [
          "STARTING",
          "RUNNING",
          "CLOSED"
        ],
        "example": "RUNNING"
      },
      "CloudBrowserArchiveStatus": {
        "type": [
          "string",
          "null"
        ],
        "description": "Archive status of the current cloud run. `null` when there is no active run record:\n- `PENDING` — pending archive\n- `ARCHIVING` — archiving\n- `COMPLETED` — archive completed\n- `FAILED` — archive failed\n",
        "enum": [
          "PENDING",
          "ARCHIVING",
          "COMPLETED",
          "FAILED",
          null
        ],
        "example": null
      },
      "CloudBrowserPageItem": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "envName": {
            "type": "string",
            "description": "Environment name.",
            "example": "marketing-01"
          },
          "proxyId": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "Proxy ID currently bound to the profile. `null` when no proxy is configured.",
            "example": "1800000000000101"
          },
          "cloudBrowserStatus": {
            "$ref": "#/components/schemas/CloudBrowserStatus"
          },
          "cloudBrowserArchiveStatus": {
            "$ref": "#/components/schemas/CloudBrowserArchiveStatus"
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Cloud runtime start time. `null` while starting, or when not started or closed.",
            "example": "2026-01-15 10:30:00"
          }
        },
        "required": [
          "id",
          "envName",
          "cloudBrowserStatus"
        ]
      },
      "CloudBrowserPageData": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Total number of records.",
            "example": "42"
          },
          "current": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Current page number.",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Total number of pages.",
            "example": "5"
          },
          "dataList": {
            "type": "array",
            "description": "Environments on the current page. Empty array when there are no results.",
            "items": {
              "$ref": "#/components/schemas/CloudBrowserPageItem"
            }
          }
        },
        "required": [
          "total",
          "current",
          "pages",
          "dataList"
        ]
      },
      "CloudBrowserConnectRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserConnectResult": {
        "type": "object",
        "properties": {
          "cdpUrl": {
            "type": "string",
            "description": "Full CDP (Chrome DevTools Protocol) address including the access `token` parameter. Pass this\nURL to an automation framework such as Puppeteer, Playwright, or Selenium to attach to the\nremote browser.\n",
            "example": "https://runtime1.morelogin.com:16167?token=c62fedaaac524e41a0f02fc4345d41cb"
          },
          "accessUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cloud browser page wrapper address. Open it in a browser to view and control the cloud\nbrowser desktop. `null` when the page wrapper is not configured.\n\nThe `token` parameter is a Base64-encoded payload carrying the desktop URL, desktop token,\nexpiry, and team, user, member, and environment IDs. The `envName` and `lang` parameters set\nthe displayed environment name and interface language.\n",
            "example": "https://official-website.morelogin.com/browser-remote?token=eyJkZXNrdG9wVXJsIjoi...ZW52SWQiOiIyMDczMzk1NDg5NzM4OTE5OTM2In0%3D&envName=P-1267&lang=en-US"
          }
        },
        "required": [
          "cdpUrl"
        ]
      }
    },
    "responses": {
      "VoidDataResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "null",
                      "example": null
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "BooleanDataResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "boolean",
                      "description": "Whether the batch operation succeeded.",
                      "example": true
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "CloudBrowserPageResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CloudBrowserPageData"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "CloudBrowserConnectResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CloudBrowserConnectResult"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "cdpUrl": "https://runtime1.morelogin.com:16167?token=c62fedaaac524e41a0f02fc4345d41cb",
                "accessUrl": "https://official-website.morelogin.com/browser-remote?token=eyJkZXNrdG9wVXJsIjoi...ZW52SWQiOiIyMDczMzk1NDg5NzM4OTE5OTM2In0%3D&envName=P-1267&lang=en-US"
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      }
    }
  }
}